import { ref, reactive } from 'vue'

// 支持的语言列表
const supportedLanguages = [
  {
    code: 'zh-CN',
    name: '中文',
    nativeName: '中文',
    flag: '🇨🇳'
  },
  {
    code: 'en-US',
    name: 'English',
    nativeName: 'English',
    flag: '🇺🇸'
  }
]

// 当前语言
const currentLanguage = ref('zh-CN')

// 语言数据缓存
const languageCache = reactive({})

// 当前语言的翻译数据
const translations = ref({})

/**
 * 加载语言文件
 * @param {string} languageCode 语言代码
 * @returns {Promise<Object>} 语言数据
 */
async function loadLanguage(languageCode) {
  if (languageCache[languageCode]) {
    return languageCache[languageCode]
  }

  try {
    // 动态导入语言文件
    const module = await import(`../locales/${languageCode}.json`)
    const data = module.default || module
    
    // 缓存语言数据
    languageCache[languageCode] = data
    return data
  } catch (error) {
    console.error(`Failed to load language file: ${languageCode}`, error)
    
    // 如果加载失败且不是默认语言，则加载默认语言
    if (languageCode !== 'zh-CN') {
      return await loadLanguage('zh-CN')
    }
    
    return {}
  }
}

/**
 * 设置当前语言
 * @param {string} languageCode 语言代码
 */
async function setLanguage(languageCode) {
  if (!supportedLanguages.find(lang => lang.code === languageCode)) {
    console.warn(`Unsupported language: ${languageCode}`)
    return
  }

  try {
    const data = await loadLanguage(languageCode)
    currentLanguage.value = languageCode
    translations.value = data
    
    // 保存到本地存储
    if (typeof window !== 'undefined') {
      localStorage.setItem('app-language', languageCode)
    }
    
    console.log(`Language switched to: ${languageCode}`)
  } catch (error) {
    console.error('Failed to set language:', error)
  }
}

/**
 * 获取翻译文本
 * @param {string} key 翻译键，支持点号分隔的嵌套键
 * @param {Object} params 参数对象，用于替换占位符
 * @param {string} fallback 回退文本，默认为key
 * @returns {string} 翻译后的文本
 */
function t(key, params = {}, fallback = key) {
  if (!key || typeof key !== 'string') {
    return fallback || ''
  }

  // 分割键路径
  const keys = key.split('.')
  let value = translations.value

  // 遍历嵌套对象
  for (const k of keys) {
    if (value && typeof value === 'object' && k in value) {
      value = value[k]
    } else {
      // 如果找不到翻译，返回回退文本
      console.warn(`Translation key not found: ${key}`)
      return fallback
    }
  }

  // 如果最终值不是字符串，返回回退文本
  if (typeof value !== 'string') {
    console.warn(`Translation value is not a string: ${key}`)
    return fallback
  }

  // 替换参数占位符
  return value.replace(/\{(\w+)\}/g, (match, paramKey) => {
    return params[paramKey] !== undefined ? params[paramKey] : match
  })
}

/**
 * 获取当前语言信息
 * @returns {Object} 当前语言信息
 */
function getCurrentLanguage() {
  return supportedLanguages.find(lang => lang.code === currentLanguage.value) || supportedLanguages[0]
}

/**
 * 获取支持的语言列表
 * @returns {Array} 支持的语言列表
 */
function getSupportedLanguages() {
  return supportedLanguages
}

/**
 * 初始化国际化系统
 */
async function initI18n() {
  let savedLanguage = 'zh-CN'
  
  // 从本地存储获取保存的语言
  if (typeof window !== 'undefined') {
    savedLanguage = localStorage.getItem('app-language') || 'zh-CN'
  }
  
  // 如果保存的语言不在支持列表中，使用默认语言
  if (!supportedLanguages.find(lang => lang.code === savedLanguage)) {
    savedLanguage = 'zh-CN'
  }
  
  await setLanguage(savedLanguage)
}

/**
 * 切换到下一个语言
 */
async function toggleLanguage() {
  const currentIndex = supportedLanguages.findIndex(lang => lang.code === currentLanguage.value)
  const nextIndex = (currentIndex + 1) % supportedLanguages.length
  const nextLanguage = supportedLanguages[nextIndex]
  
  await setLanguage(nextLanguage.code)
}

/**
 * 检查是否为指定语言
 * @param {string} languageCode 语言代码
 * @returns {boolean} 是否为指定语言
 */
function isLanguage(languageCode) {
  return currentLanguage.value === languageCode
}

// 导出国际化功能
export {
  currentLanguage,
  translations,
  supportedLanguages,
  setLanguage,
  t,
  getCurrentLanguage,
  getSupportedLanguages,
  initI18n,
  toggleLanguage,
  isLanguage
}

// 默认导出
export default {
  currentLanguage,
  translations,
  supportedLanguages,
  setLanguage,
  t,
  getCurrentLanguage,
  getSupportedLanguages,
  initI18n,
  toggleLanguage,
  isLanguage
}